<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 这种继承方法 使用了call apply bind能够修改this指向的特点 进行了对象冒充 但是这种方法 子类无法获取父类的原型上的属性和方法
        function Game(name, type) {
            this.name = name
            this.gameType = type
            this.say = function() {
                console.log('欢迎来到' + this.name);
            };
            // console.log(this);
        }
        Game.prototype.run = function() {
            console.log('游戏运行了');
        }

        function Role(roleName, hit, sex) {
            // Role函数中的this指向 指向他的实例化对象 所以这里面的this === role
            this.roleName = roleName
            this.hit = hit
            this.sex = sex
            this.dance = function() {
                console.log('给我来一段');
            };
            // call可以修改this指向 他的第一个参数就是要修改的函数内部的this指向 指向的对象
            // call可以以散落的形式给调用call方法的函数传递参数
            // Game.call(this, '王者荣耀', '手游')
            // apply可以修改this指向 他的第一个参数就是要修改的函数内部的this指向 指向的对象
            // apply可以以数组的形式给调用apply方法的函数传递参数
            // Game.apply(this, ['王者荣耀', '手游'])
            // bind 的参数是要修改的this指向 指向的对象 但是bind的返回值是调用bind方法的函数本身 函数需要再次调用才会执行
            // console.log(Game.bind(this));
            Game.bind(this)('王者荣耀', '手游')
        }


        let role = new Role('李白', '70', '男');
        console.log(role);


        // let obj = {}

        // function Perons(name, age, type) {
        //     this.name = name
        //     this.age = age
        //     this.type = type
        // }


        // function getObj() {
        //     Perons.call(obj, '李狗蛋', '15', '黄种人')
        // }
        // getObj()
        // console.log(obj);
    </script>
</body>

</html>